package thread;

/**
 * 互斥性
 * 当使用多个synchronized锁定多个不同的代码片段，并且指定的同步监视器对象相同时。
 * 这些片段之间就是互斥的
 * 总结：
 * 1.并发官话就是多个线程并发操作同一临界资源，由于线程切换时间不一样，会导致切换顺序出现混乱而产生一些不好的结果，
 * 说人话就是大家抢一个东西乱套了。
 *
 * 2.解决办法是排队，怎么排队，使用synchronized，它的作用是可以让多个线程排队执行，
 * 官话叫做同步执行，异步就是你干你的我干我的，同步就是有顺序关系。
 *
 * 3.synchronized一种是可以让在方法上加，一种是同步块，方法上加一般不这么干，除非方法中的都要同步，排队范围太大了
 * 范围越大效率越低，尽量精益求精，只在需要的地方排队，使用同步块可以精准的控制想排队的代码片段，只在必要的地方排序，
 * 效率高。
 *
 * 4.同步块需要指定同时监视对象，同步监视对象两个选取规则，第一一定是引用类型，第二多个线程看到的一定是同一个对象，
 * 一般锁的是临界资源，也就是抢谁锁谁，静态方法直接锁定类对象，即类名.class。
 *
 * 5在两个方法中加synchronized，同一个对象调用，
 * 即为互斥
 */
public class SyncDemo5 {
    public static void main(String[] args) {
        Coo o = new Coo();
        Thread t1 = new Thread(o::methodA);//执行o的methodA方法
        Thread t2 = new Thread(o::methodB);
        t1.start();
        t2.start();
    }
}


//注意只锁一个方法 还是异步 锁两个才同步 这就是互斥
class Coo {
    public  synchronized void methodA() {//锁方法锁的就是this  o
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + "正在执行A方法");
            Thread.sleep(3000);
            System.out.println(t.getName() + "A方法执行完毕");
        } catch (InterruptedException e) {
        }
    }

    public void methodB() {
        synchronized (this) { //o
            try {
                Thread t = Thread.currentThread();
                System.out.println(t.getName() + "正在执行B方法");
                Thread.sleep(3000);
                System.out.println(t.getName() + "B方法执行完毕");
            } catch (InterruptedException e) {
            }
        }
    }
}
